home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / rpg / crossfir.000 / crossfir / crossfire-0.92.4.client / Protocol < prev    next >
Internet Message Format  |  1996-04-21  |  47KB

  1. From Eric Anderson:
  2.  
  3. Overall, the client talks to the server through a tcpsocket.  It recieves
  4. messages telling it what to do, and it sends inputs to the server.  Many
  5. of the commands are more low-level than would be preferrable, but the
  6. low-level commands mesh better with the current crossfire implementation.
  7.  
  8. ------------------------------------------------------------------------------
  9. Since Mark's and Eric's client efforts were merged, there is no real
  10. good documentation on how things are sent.  For stuff I (Mark) have done,
  11. I have included the workings immediately below.  The previous protocol
  12. file then follows.
  13.  
  14.  
  15. C->S: reply <text>
  16.     Sends <text> as a reply to the last query command sent.
  17.  
  18.  
  19. S->C: query <flags> <text>
  20.     Asks the client program for input.  This is only used in a few places -
  21. mostly in creating a character and login, but in fact anyplace in the server
  22. that changes the input state (pl->contr->state, ST_*), should send a query.
  23.  
  24.  <flags> are detailed in the <newclient.h> file, which is common to
  25. both the client and server.  The flags of relevance to this command
  26. are the CS_QUERY flags.
  27.  
  28.  The client is free to ignore the flags.  However, if the server
  29. just wants a single character as a reply, that is all it uses, even if
  30. the client sends a long string (Server will use the first character.)
  31.  
  32.  <txt> is the questoin/prompt that should be printed.  Right now,
  33. it is typically just a ':'.  Client should display it no matter what
  34. is is, however.  An empty string (""), can be sent if there is no
  35. question/prompt.
  36.  
  37.  
  38. C->S: command <txt>
  39.     Client sends a command to the server.  Ordinary commands (ie, north,
  40. west, apply, maps, etc), might be sent, commands with options may be sent
  41. (ie, 'invoke create food of booze', 'cast medium fireball'.  There
  42. are a few special commands that can also be sent.
  43.  
  44. 'fire' command is a special case.  The server will handle repeat
  45. firing. 
  46.  
  47. 'fire_stop' will be sent to inform the server to stop firing.  A different
  48. command name has been chosen to make things easier on the server
  49. ('fire_stop' should be a 0 time command, with the rest of the fire commands
  50. actually taking some time.)  In some cases, 'fire_stop' maybe sent almost
  51. immediately after the first fire (in cases where the player only wants to
  52. fire once).
  53.  
  54. ------------------------------------------------------------------------------
  55.  NOTE - this is a long message.  If you are totally uninterested in
  56. the client/server project, just skip it.
  57.  
  58. I figured it would be a good idea to post the revised Protocol.  I know
  59. at least a few people have comments which I have put in.  But first, I would
  60. like to make a few comments/ask a few questions.
  61.  
  62. 1) Server output buffer overflow:  What to do in this situation has
  63.   not really be determined.  Keeping the client on-line becomes difficult,
  64.   because the server can not be sure of the information that the client
  65.   did not get, and likewise, the client can not be sure of what information
  66.   it did not get.  One solution would be to have something like a
  67.   RESEND_ALL_DATA command that the client sends to the server.  (Server
  68.   would need to send some command to the client informing it of the
  69.   data loss in the first place.
  70.  
  71.   AFter getting the RESEND_ALL_DATA, the server then sends all the player
  72.   information (stats, items) and the map information. (note that this will
  73.   take a nontrivial amount of time)
  74.  
  75.   This works quite well, depending on what caused the overflow in the
  76.   first place.  If it was just a temporary backlog, this is not a problem.
  77.   If the player is on a slow link, and went someplace where a lot of
  78.   updates is going on, this won't help much (but in such a case, the
  79.   player will probably die, which will then end the updates.
  80.  
  81.   Other option is drop the connection (as if the player dropped it.)  What
  82.   happens in this case has not been determined.  Saving the player where
  83.   he was is a bad idea for 2 reasons:  1) He may now be trapped (behind
  84.   a gate, with the lever on the other side), or 2)  He may be in a treasure
  85.   chamber.  Picks everything up, breaks the connection (and is thus
  86.   saved with all his good stuff), reconnects sometime later (when the map
  87.   has reset), and repeats the process.  At some point, he then
  88.   exits.
  89.  
  90.   One option, especially with NOT_PERMADEATH, would be to just 'kill'
  91.   that character, which pops him back to the starting town, and then
  92.   save him.  A bit harsh, however.
  93.  
  94.   What might be the best way is to have the configurable option of where the
  95.   player gets sent to (map and location) when the connection is lost.
  96.   One situation might be a jail cell, with a savebed, but otherwise no
  97.   way out.  Thus, mail to the site administrator would need to be sent
  98.  
  99. 2) Conversation between me and others have gone on about whether absolute
  100.  or relative coordinates should be used.
  101.  
  102.   Relative has several advantages:  You can not cheap (with absolute,
  103.   if you are at 0,0 (or the top of left row), you know that those walls could
  104.   not contain secret doors.)  Teleporters are another problem - with
  105.   absolute, you would know where you were teleported to.
  106.  
  107.   The disadvantage is that the client and server need to be synchronized
  108.   to where they think the player is.  Ie, server things player is at 15,12
  109.   and gets an EXAMINE +2 -1 (which woudl be 17,11)
  110.   When client issued that command, it thought that the player was at 14,11
  111.   (and was thus examining 16,10).  Only C->S commands have this problem,
  112.   S->C commands would not - the server would make sure it sends the 
  113.   player movement first.
  114.  
  115.   Absolute has some advantages/problems also:
  116.   EXAMINE problem above is not a problem.
  117.   Generating a random offset when the map is loaded that is then added
  118.   to all x and y locations would make it impossible to know if you are at
  119.   a top of left wall (this could be disabled.)
  120.   Absolute should probably be easier to debug.
  121.   Absolute does have a problem with the MOVE command for the player -
  122.   this is pretty much the same as the EXAMINE command that relative
  123.   has:  The client would need to know where the player is to do
  124.   proper move commands (ie, player is at 12,10.  Client does
  125.   a MOVE <tag> 13 10 (to move the player to space 13 10).  Player types
  126.   north.  Client still thinks player is at 12,10 (has received update
  127.   for it yet - perhaps never will if 13,10 was a wall).  Do you send
  128.   MOVE 12 9 or MOE 13 9?  With relative, it would be MOVE 0 -1 no matter
  129.   what.
  130.  
  131.   So now, once again, I am leaning to using relative coordinates (player
  132.   movement is much more important than examing spaces.)  But since previous
  133.   version suggested absolute coordinates were going to be used, I thought
  134.   it a good idea to bring this up, in case there are people who want to
  135.   give reasons in support of absolute coordinates.
  136.  
  137. 3) ITEM vs MAP command:  What gets sent as what has not been fully
  138.   determined.  MAP may end up sending archetype or animation
  139.   sequences.  In this case, it would be reasonable that ITEM commands
  140.   are only sent for items in the same square the player is on.
  141.  
  142.   If MAP ends up using faces, then only animated items that are
  143.   continously animated (ie, diamonds, wands, etc, not grated, gates,
  144.   etc) would be sent with ITEM commands.  But this might be extended to
  145.   include any item that the player picks up (so as the player moves around
  146.   the visible map, new ITEM commands need not be sent.
  147.  
  148.  
  149.  That is all for now - the Protocol file follows.
  150.  
  151.  --Mark
  152.  
  153.  
  154. ------------------------------------------------------------------------------
  155. Some of these commands have actually been implement, and are denoted
  156. with (done) or other status in the area they are described.
  157.  
  158. Quick summary of Protcol commands:
  159.  
  160. Fields enclosed in < and > fields that are variable.  [ and ] denote
  161. optional fields, and these can be nested.  { and } mean that the information
  162. contained within these may be repeated many times, but with different values
  163.  
  164. C->S means client to server, S->C means server to client.
  165.  
  166. C->S: PROTOCOL <val>     (informs server its protocol versions, also triggers
  167.              new client status.  Completed)
  168.  
  169. C->S: SEND_IMAGE_NAMES    (requests the server to send all the image names
  170.              it knows about.  Optional startup command.
  171.              Completed)
  172.  
  173. S->C: I_IMAGE (list)    (list of the image names.  Exact format detailed
  174.              below.  Completed)
  175.  
  176. C->S: SEND_ARCH_NAMES    (These two commands are sme as the IMAGE commands
  177. S->C: I_ARCH (list)     above, except send/request the archetype names.
  178.              Completed.)
  179.  
  180. C->S: LOGIN <version> <name> <password>
  181.             (Logs in a player - client side completed)
  182.  
  183. S->C: TEXT <message>    (Sends text that the client should display. Completed)
  184.  
  185. S->C: PLAY <sound> <vol>
  186.             (Informs the client it should play a sound)
  187.  
  188. S->C: STAT <stat> <current> <maximum>
  189.             (Sends a player stat - Done)
  190.  
  191.  
  192. C->S: REQUEST <name> <type>
  193.             (requests data.  Done)
  194.  
  195.  
  196. S->C: TRANSMIT <name> <type> <length>
  197.             (sends data.  Done)
  198.  
  199.  
  200. (both): ERROR [<type> [<name>]] <text>
  201.             Reports an error (Done)
  202.  
  203. S->C: QUERY <flags> <text>
  204.             Asks the client/player a question. (Done on
  205.             client side - on server side, input still needs
  206.             to be done)
  207.  
  208. S->C: KNOWN_SPELLS {<name>}
  209.             sends a list (string) of all the spells the player
  210.             knows.
  211.  
  212. S->C: RANGE <range> <tag>
  213.             Informs client that item <tag> is now range attack
  214.             <range>
  215.  
  216. C->S: APPLY <tag> <x> <y>
  217.             Applies an item.
  218.  
  219. C->S: FIRE <flags> <tag>
  220.             Fires an object/spell.
  221.  
  222. C->S: SAY <flags> <text>
  223.             Say something to other players/NPC's
  224.  
  225. C->S: REPLY <text>    Response to a query command.
  226.  
  227. C->S: SET <var> <value>
  228.             Set some variable to value
  229.  
  230. C->S: EXAMINE <tag> <locx> <locy>
  231.             Look at object/space at <locx> <locy>
  232.  
  233. C->S: COMMAND <text>    Have the server run some command (who, maps, etc)
  234.  
  235. C->S: SET <var> <val>    Sets a variable to a specific value (what those
  236.             values mean vary from variable to variable)
  237.  
  238. S->C: ITEM <length_flags> <tag> <locx> <locy> <flags> <arch_name> <image_name>
  239.     <weight> <nrof> <name>
  240.             Sends a piece of ITEM information to the client.
  241.             Many of the values are optional - what values are
  242.             sent is determined by the <length_flags> value.
  243.  
  244. S->C: VIEW <tag>    Sets item with <tag> as the object that sees the map
  245.  
  246. S->C: MAP_END        Tells the client that it has sent the full map
  247.             update for that particular 'tick'.  Gives the
  248.             client some idea if it should update the
  249.             map display.
  250.  
  251. (both) MOVE <tag> <number_of> <from_x> <from_y> <to_x> <to_y>
  252.             Moves an item.  In the client to server direction,
  253.             this could probably be handle by an ITEM command.
  254.  
  255. ==============================================================================
  256. >GENERALITIES
  257. >============
  258. >
  259. >A bi-directional 8-bit wide clean error-free channel of some form
  260. >exists between the client and the server.  Absolutely all communication
  261. >between them occurs on this channel and a client can receive everything
  262. >it needs to run through it.  Typically this channel will be a TCP/IP
  263. >connection, but it may very well in some situations be a high speed
  264. >modem connection or a UN*X pipe or some completely different network
  265. >protocol. (DONE - code taken from old client program)
  266. >
  267. >In practice the up channel (from client to server) and the down channel
  268. >(from server to client) function as two independent uni-directional
  269. >chutes.  If one side has something to tell to the other it just drops a
  270. >packet into its send channel and forgets about it.  Confirmations are
  271. >not given or expected.  The sender just assumes that the receiver will
  272. >handle the packet or it will complain in another packet.  At the same
  273. >time the two chutes may be communicating about two entirely different
  274. >subjects.
  275. >
  276. >Each packet consists out of one line of text terminated by a newline
  277. >(0x0a) character.  Line lengths of up to 4096 characters (including the
  278. >terminating newline) are guaranteed to work.  The receiver may
  279. >correctly interpret longer packets, silently drop them or send an error
  280. >message (see below) depending on what makes sense for the receiver.
  281. >All characters are case sensitive.
  282. >
  283. >Every packet begins with a word terminated either by a space (0x20) or
  284. >the end of the packet.  The interpretation of the rest of the line
  285. >depends on the initial word.
  286. >
  287.  
  288.  The output buffer on the server will be large enough to hold
  289. several packets (right now, it is set for 32K).  Non blocking i/o
  290. is set on the socket, so data will disappear if the socket fills up.
  291.  
  292. All <flags> detailed in this file are in the newclient.h header
  293. file.  These are always sent in base 10 form (ie, 10 instead of 0xa)
  294.  
  295. For cases where a protocol command has several arguments, and some
  296. of these are string's that may contain spaces, these arguments
  297. should then be double quoted.
  298.  
  299. Example of a LOGIN command:
  300. LOGIN "cfclient 1.0 (X11)" "Tiberius" "????"
  301.  
  302.  All of these need to be double quoted - the client version may very
  303. well have spaces (like this one does), and the name or password for
  304. a character could also have spaces.
  305.  
  306.  Note that the double quoting is not perfect.  If the quoted string has a
  307. double quote, then it may not get interperted properly.  Example:
  308. ""hello"" there" would get interperted as two arguments, one "hello" and the
  309. other would be there" There is no foolproof way to totally handle this.
  310.  
  311. Note that if the string is the last argument of a protocol command,
  312. then double quoting is not needed.  Examples are TEXT commands -
  313. the remainder of the line is the text to be printed.
  314.  
  315. The base input routines in both the client and server are completed.
  316.  
  317. ==============================================================================
  318. STARTUP
  319. =======
  320.  
  321. Note that the order of this section is the order that the commands
  322. should be sent.
  323.  
  324. ------------------------------------------------------------------------------
  325. C->S: PROTOCOL (revision) This is the revision number that the client
  326. understands.  The server should be able to communicate to a client with any
  327. protocol version:  If the protocol is older than the servers, the server
  328. will know what commands to not use.
  329.  
  330.   In general, changes to the protocol should not happen very often, but this
  331. gives a mechanism for making changes and not requiring every client to
  332. upgrade.  The old clients will just not be able to take advantage of the new
  333. commands.
  334.  
  335.   In cases where the client has a newer protocol than the server, there may
  336. be problems, as the client will send commands to the server that the server
  337. does not understand (possibly - depends what commands are added.)  But this
  338. situation should not happen very often, as the servers should in general be
  339. kept up to date, and very seldom see a client newer than they are.  One
  340. solution to this is to have the client know all the commands that are added
  341. to the protocol.
  342.  
  343. The PROTOCOL command has been implemented.  In fact, it is the way the
  344. client informs the server that it is a 'new' client.  However, since
  345. revision 1 of the protocol is not completed, no checking is done for
  346. compatibility.  The way it should be handled in the server is like this:  In
  347. functions that send the new protocol commands, it should check to make sure
  348. the client would understand.  If not, it should call whatever functions (or
  349. do nothing) that get the same results with the older protocol requests.
  350. These functions may in turn call functions that use even older protocol
  351. requests.  A function should never call a function that uses a newer
  352. protocol command than what it uses.  The way to implement this is to have 1
  353. top level function of each command, with this function sending the
  354. appropriate request.
  355.  
  356. ------------------------------------------------------------------------------
  357.  
  358. C->S: SEND_IMAGE_NAMES
  359. S->C: I_IMAGE (image) (image) ... - the I_ stands for initialization stage.
  360. What the server does is send all the image names it knows about to the
  361. client, so the client can see if it is missing any images.  Any number
  362. of image names can be on one line (within limit of 4096 bytes). (Done)
  363.  
  364. ------------------------------------------------------------------------------
  365.  
  366. C->S: SEND_ARCH_NAMES
  367. S->C: I_ARCH (archname) (archname) ... - this sends all the archetype
  368. names the server knows about to the client.  In this way, the client will
  369. know if it is missing any archetypes.
  370.  
  371. The client can determine if it wants the I_ARCH and I_IMAGE stuff sent.  The
  372. idea is that if the client knows what is missing, it can get that information
  373. at startup, instead of later when playing the game.  The client can then do
  374. REQUEST's to the server to get the information it needs.
  375.  
  376. The first name must be START, and the last be END.  This makes the
  377. client code quite a bit simpler.
  378.  
  379. Note - while these are meant for initialization stage only, the 
  380. SEND_* commands can be sent to the server at any time.
  381.  
  382. ------------------------------------------------------------------------------
  383.  
  384. C->S:LOGIN <client-version> <name> <password>
  385.  
  386.  Before play can actually begin, this command must be sent.
  387.  
  388.  Other commands may have been sent before this (PROTOCOL must have
  389. been, and various SET and SEND_IMAGE or SEND_ARCH names may also
  390. have been sent.
  391.  
  392. <client-version> is a string created by the client at compile time.  The
  393. server should not treat different clients differently.  This string is just
  394. there to be able to gather statistics (and to correlate with ERROR packets).
  395.  
  396.   <name> and <password> are is the player's name and password.  It is
  397. up to the client to input these, do keystroke hiding if desired, etc.
  398.  
  399.  the client-version, name, and password all must be double quoted.
  400. This is because any of those fields could contain spaces.
  401.  
  402.  It is up the client to confirm if the player wants to LOGIN again
  403. when he is already playing a character.  When the server receives
  404. this command, the current character is terminated - the server assumes
  405. that this is what the player wants to do, and doesn't do confirmation
  406. on its part)
  407.  
  408.  
  409. ==============================================================================
  410. >VALID COMMANDS FROM THE SERVER TO THE CLIENT
  411. >============================================
  412. >MAP <locx1> <locy1> <image1> <locx2> <locy2> <image2> ...
  413. >Using one of these commands the server may tell the client that it sees
  414. >the map at a series of location given by coordinate pairs.  The name
  415. >refers to the image to use for the particular map location.  If the
  416. >client doesn't know that particular name, it asks the server for it
  417. >(see REQUEST/TRANSMIT).
  418.  
  419.  If the same location is received in one or a series of MAP commands,
  420. this means that multiple objects are on that square.
  421.  
  422. ------------------------------------------------------------------------------
  423. >
  424. >UNMAP <locx1> <locy1> <locx2> <locy2> ...
  425. >This command tells the client that a certain series locations isn't any
  426. >longer in the LOS of the player.  The client may respond to this by
  427. >erasing the squares in question, shading them to indicate to the user
  428. >that they aren't any longer directly visible or just by doing nothing.
  429.  
  430. No matter what the client does, the data in unmapped squares is just
  431. old data - it may very well not be correct.
  432.  
  433. ------------------------------------------------------------------------------
  434. S->C: REMAP <locx1> <locy1> <image1> ....
  435. This is the same as the MAP command (including format), except it
  436. means that the client should remove all contents on the square
  437. sent.  In this way, an UNMAP is not required.  the blocked face
  438. image can be sent for squares no longer visible.
  439.  
  440.  How the server uses the MAP/UNMAP/REMAP commands is up to it.
  441.  
  442. ------------------------------------------------------------------------------
  443. ITEM <length_flags> <tag> <locx> <locy> <flags> <arch_name> <image_name>
  444.     <weight> <nrof> <name>
  445.  
  446.  Sends item information to the client.  ITEM is used for alive
  447. objects and objects in the players inventory.  In fact, MAP could be
  448. used for all objects on the MAP except those below the player and
  449. in the players inventory.  How the server determines what is sent as
  450. an ITEM and as a MAP command is up to it.
  451.  
  452. <length_flags> is a bitmask of what values it is sending along.  Whether
  453. the server actually uses this to any meaningful value, or just sends
  454. along the entire ITEM each time is up to it.
  455.  
  456.   The <length_flags> have the following meaning:
  457.   0x1    <flags>
  458.   0x2    <arch_name>
  459.   0x4    <image_name>
  460.   0x8    <weight>
  461.   0x10    <nrof>
  462.   0x20    <name>
  463.  
  464.   Note that there is no entry for <tag> and location.  These values
  465.   must always be sent.
  466.  
  467.   The order of the data is always that of the full ITEM command.  So
  468.   if <length_flags> was 0xA, then the format would be:
  469.  
  470.   ITEM 10 <tag> <locx> <locy> <arch_name> <nrof>
  471.  
  472.   Note that the <length_flags> is always converted into a base 10 form
  473.   when sending.
  474.  
  475. <tag> is a unique number for that object for the game.  In this
  476. way, both the client and server will always know that specific item
  477. is being referred to.
  478.  
  479. <locx> and <locy> are the location of the object on the map.
  480. If <locx> is IN, then <locy> is the tag that the item is contained
  481. in.
  482.  
  483.   <flags> contains various flags.
  484.   values from 0-8 are direction.  0 is no direction, 1 is north,
  485.   2 is north east, 3 is east, 4 is southeast, and so in the directions,
  486.   with 8 being northwest.  These are the same that the server presently
  487.   uses all over the place, but (At least right now) seem to have
  488.   no enumeration/define setting this.
  489.  
  490.   0x10 - this is the player object.  Note the VIEW will not necessary
  491.   tell the client this, but the client needs to know what objects should
  492.   be the players for setting stats, etc.
  493.  
  494.   0x20 - this is a container.  This may not be truely necessary, but
  495.     gives the client an idea if this item is applied that things should
  496.     go in here.
  497.  
  498.   0x40 - delete the item (ie, it is used up, destroyed, etc.)
  499.  
  500.   0x80 - this is an update for the item.  This may not be
  501.     used - the client should make sure on its own if it knows
  502.     an item with that tag.  This should not be difficult - the
  503.     client isn't going to be keeping track of that many items, so
  504.     at worst, it could just look through its entire linked list.
  505.  
  506.  
  507. <arch_name> is the archetype name.  This gives the client enough
  508. information to handle the animations.  Also, the local client archetype
  509. file may have more information on this item, so that the client can perform
  510. intelligent actions on it.
  511.  
  512. <image_name> is the image name.  This should rarely be sent - only in
  513. cases where the image name is actually changed (things like gems of
  514. great value, etc)
  515.  
  516. <weight> is the object weight.  This should only be sent for items in the
  517. look and inventory windows.
  518.  
  519. <nrof> is the number of objects.
  520.  
  521. <name> is the name of the object, with double quotes around it (so
  522. if future options are added, it will be easier to parse for objects
  523. that have spaces.)  In general, it is up to the client to do special
  524. things based upon names (like equipped, magic, etc.)
  525.  
  526. Note that color is not sent for any objects.  Changing color in
  527. objects is strongly discouraged - the only system that can use it
  528. are fonts or bitmaps on color displays.  XPM can not have their color
  529. changed, no can you change the color on monochrome systems.
  530.  
  531. Notes:
  532.  
  533. I believe in some followup, both MAP and ITEM commands had (light_value)
  534. as part of their description (if/when light sources get added).  These
  535. are not needed right now - the PROTOCOL revision can add this in later,
  536. and still have things work.  Since adding light seems like a long ways
  537. away, and can easily be handled with <length_flags> for the ITEM
  538. command (server always clear that flag, and thus never send light value
  539. for old clients), it doesn't seem worthwhile to try and support it now.
  540. Depending on the implementation of it, what exactly gets sent may
  541. vary.
  542.  
  543. ------------------------------------------------------------------------------
  544.  
  545.  
  546. VIEW <number>
  547. After this command the client considers the item with the tag <number>
  548. to be the viewpoint item and will always try to center the map around
  549. it.  This is typically the item which is the player object.
  550.  
  551.  This is not strictly needed since a flag in the ITEM command informs
  552. the client what the player object is.  But it is a very nice
  553. extension - if a spell like magic eye, or perhaps find familiar is
  554. added, it would allow the player/owner to look at the map through this
  555. eye.
  556.  
  557. ------------------------------------------------------------------------------
  558.  
  559. MOVE - same as the client command that is sent to the server.
  560.  
  561.  
  562. ------------------------------------------------------------------------------
  563.  
  564.  Note that this example is grossly out of date on the format it uses
  565. for many of the commands.
  566.  
  567. Examples of how the above works (taken from another mail message by Carl)
  568.  
  569. Server->Client: VIEW 123
  570. (states that object 123 is the center object of the map, and calculates
  571. LOS accordingly).
  572.  
  573. S->C: MAP 40 40 floor 41 40 wall 42 40 wall ...
  574. (sets what objects are where.  IT is not clear in the present
  575. protocol about sending two different images with the same coordinate
  576. via the map command.  I would think that this means that there are those
  577. two images there, and not that an overwrite should occur)
  578.  
  579. S->C: ITEM 123 44 44 1 Carlsimage Carl
  580.            ^    ^  ^ ^  ^          ^
  581. Itemtag ---|    |  | |  |          |
  582. X coordinate ---|  | |  |          |
  583. Y coordinate ------| |  |          |
  584. Quantity ------------|  |          |
  585. Name of image ----------|          |
  586. Name of item ----------------------|
  587.  
  588. (this is the player item.  The view command centers the map
  589. around this object).
  590.  
  591. S->C: ITEM 433 IN 123 1 helmetimage X ray Helmet (worn)
  592. Tells the client that this item is in the player item.  It can
  593. keep track of this in the inventory window.  Note that the (worn)
  594. is just part of the name.  If the client recognizes this and then does
  595. something special, that is its perogative.
  596.  
  597. More item commands like the above would happen as the players inventory
  598. is sent.  Now that you could having something like:
  599. S->C: ITEM 600 IN 123 1 luggage The Luggage
  600. S->C: ITEM 605 IN 600 5 gems Gems
  601.  
  602. The first states that the player is carrying the luggage, and the second
  603. is stating that he has 5 gems in the luggage.
  604.  
  605. C->S: MOVE 123 44 45
  606. A request by the client to move the player (object 123) south (from
  607. 44 to 45).  Remember, that the maps make 0,0 as the upper left corner,
  608. not lower left as in standard geometry.
  609.  
  610. The server then process this command.  If the player can make this
  611. move (no wall), and when sufficient time has passed (slowdown factor),
  612. it sends:
  613.  
  614. S->C: ITEM 123 44 45
  615. Telling the client that object 123 is now at 44,45.  IT does not
  616. need to send full data, since this object never left LOS.
  617.  
  618. However, this does require that the server keep track of an object in
  619. LOS or if it leaves it.  This because a bit of an implementation problem -
  620. you don't want to keep track of whether each object is in LOS for
  621. each player - this would chew up a lot of memory and would probably
  622. hard code some maximum number of players (if you use an int, you only
  623. have 32 bits for LOS for players).
  624.  
  625. As I see it, an array of some sort will need to be kept in the
  626. player structure, with this array containing what objects/images were
  627. last drawn around the player.  Then each tick, you go through and see
  628. what is around the player, and see if any new objects have appeared,
  629. and send ITEM/MAP commands for them.  A linked list could be used to keep
  630. track of the items it has sent descriptions for.
  631.  
  632. Another method would be to keep track of this information when the
  633. object changes/moves.  Perhaps have a few fields of linked list of
  634. objects in the players - one for 'changed' and one for entered field
  635. of view.  Then, when the object moves/does whatever, it checks to see
  636. if it is in any players field of view, and if so, puts itself on
  637. one of those lists (changed or entered field of view).  Then, this
  638. data is processed, and it would be decided if it is sent down the
  639. line or not (determined via stacking).  However, this would require
  640. all ITEM commands need to be sent, or you once again need to keep track
  641. someplace what items have been sent down the line (and also need to
  642. somehow keep track of what was sent down the line but is no longer
  643. visible.
  644.  
  645.  IF anyone has good ideas on how to handle this area, I would
  646. be interested.
  647.  
  648. Back to the player moving (S->C: ITEM 123 44 45):
  649.  
  650. When the client recieves this, it should scroll the map up one.
  651. It now sends a map command to fill the new bottom row up:
  652. S->C: MAP 40 50 wall 41 50 wall 42 50 wall ...
  653.  
  654. S->C: UNMAP 40 40 41 40 ...
  655. removes the row that scrolled off.  I personally don't think this
  656. is necessary - if a row scrolls off the edge of the display, it should
  657. be taken as an implicit unmap.
  658.  
  659.  
  660. LOS is updated (IMHO, this should be done before the MAP command),
  661. and new object that appear are sent:
  662. S->C: ITEM 642 45 50 1 orcimage Orc chieftain
  663.  
  664. Orc wants to attack player, so it moves towards him:
  665. S->C: ITEM 642 45 49
  666. S->C: ITEM 642 45 48
  667. S->C: ITEM 642 45 47
  668.  
  669.  Since the item tag number is unique, each item command effectively
  670. removes the previous location.
  671.  
  672. Problem: This requires that for each ITEM command received by the client,
  673. the client needs to search through all the old ITEM objects it has stored
  674. to see if an item of that tag exists someplace else.
  675.  
  676. The player decides to drop his helmet (has not moved any spaces):
  677. C->S: MOVE 433 44 45
  678.  
  679. This is a request by the client to drop the helmet.  Effectively, it is a
  680. move out of inventory and onto the map.
  681.  
  682. S->C: ITEM 433 44 45
  683. Server process the command.  Note that the client has to search through
  684. all the items it knows about and find the one with tag 433 and remove it.
  685.  
  686. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  687.  
  688. S->C: TEXT <text>
  689.  
  690.  Sends <text> that the client should display.  Client can do whatever
  691. it wants with the text, but should keep it intact.
  692.  
  693. Note that the TEXT sent can not have a newline in it - this is the
  694. packet termination character.  Instead, multiple TEXT commands will
  695. need to be sent.
  696.  
  697. ------------------------------------------------------------------------------
  698.  
  699. PLAY <sound> <vol>
  700. Instructs the client to play the sound with the specified name.
  701.  
  702.  <vol> is the volume of the sound.  It is an integer ranging from 0 to
  703. 200.  0 would be silent (should never be sent) 100 is normal volume, and
  704. 200 is very loud (should be near max volume.)  Client is free to adjust
  705. volumes (ie, could scale them down by 50% before playing them, thus
  706. implementing a program volume control)
  707.  
  708.  It is up to the client to get sounds appropriate for it, and do any
  709. name matching to that sound.  Supporting transmissions of sounds in the
  710. server could be done, but sound formats vary too much, plus sounds take
  711. up a lot of space.
  712.  
  713.  If running the rplayd, then it would get sounds automatically from an rplay
  714. server that is set up.  Seems pointless to recreate code that is already in
  715. place.
  716.  
  717. ------------------------------------------------------------------------------
  718.  
  719. >STAT <stat> <current> <maximum>
  720. This tells the client that the value of the player statistic called
  721. <stat> is <current>, with maximum the max value of that stat.
  722.  
  723.  If maximum is -1, it likely means that a maximum value for that
  724. stat is not available (experience, for example.)
  725.  
  726.  How the client displays these stats is up to it.
  727.  
  728. <stat> can be any of level, exp, hp, sp, str, dex, con, wis, cha, int,
  729.  wc, ac, armor, dam, speed(*) food, weapon_sp(*)
  730.  
  731. * - These values are stored as floats, but since all other values are ints,
  732. it is easier to transmit it as int.  Thus, they will be multipled by
  733. 1000 by the server (giving 3 decimal places.)  The client should reverse
  734. this.
  735.  
  736.  
  737. ------------------------------------------------------------------------------
  738.  
  739. C->S: REQUEST <name> <type>
  740. S->C: TRANSMIT <name> <type> <length>
  741.  
  742.  This transmits file <name> with <type> to the client.
  743.  
  744.  As of now, all of the files that get transmitted are done in text
  745. format.  But in theory, it is possible for this command to transmit
  746. binary files.
  747.  
  748.  If <length> is 0, then it is a text transmission, and END_OF_DATA
  749. on a single line signals that is the end of the data.
  750.  
  751. <name> is the name of the data to be sent.  If it has spaces, the name
  752. should be escaped with double quotes ("), with the name itself not containing
  753. a double quote character.
  754.  
  755. <type> for both REQUEST and TRANSMIT can be any of: XPM, BIT, or ARCH.
  756. XPM are xpm images.  All server should support this - the XPM library
  757. will not be needed - only the data files.
  758.  
  759. BIT are the bitmaps (monochrome images).  All servers must support
  760. this data.  It is up to the client whether to request a XPM or BIT file -
  761. this will likely depend on what type of display and other options are given
  762. to the client.  Both XPM and BIT data will be in text format.
  763.  
  764. ARCH is archetype data.  The full archetype is not sent - only the name
  765. (both arch and item), and image name/animations.  This must be supported.
  766. Note that format used for ARCH TRANSMIT's is not exactly the same as used in
  767. in archetype file.  This makes it easier for the client to process, because
  768. some information that we already know about (like the number of animations)
  769. is supplied.  Also, the animations are prefixed with an anim_image string,
  770. so we don't need to worry about receive states.
  771.  
  772. Data will only be transmitted if the client requests it.  Thus, if the
  773. client knows it will never request XPM data (due to hardware limitations, or
  774. perhaps a low memory client), it does not need to support receiving XPM data.
  775.  
  776. The server will send the data as fast as it gets request.  Thus, the client
  777. should only request a little at a time, otherwise the socket buffer might
  778. overflow (if on a slow connection).  What the server does in such situations
  779. is not yet clear.
  780.  
  781. By default, the size of the socket buffer is set to 32K - this is pretty big.
  782.  
  783. Note:  How the server keeps it data is up to it.  It has been pointed
  784. out to me that if the server keeps the XPM images in compressed/gzip
  785. format, then each time a file is requested, the file will need to be
  786. decompressed.
  787.  
  788.   The data follows a set standard.  Whether this is done by pulling
  789. information out of the crossfire.pix.? files or by keeping all the
  790. .xpm files around which the server accesses is it to it.  The code
  791. I wrote assumes things will be kept in the crossfire.pix.? format.
  792.  
  793.  This note is also relevant to the bitmap data.  Archetype data
  794. is created from the archetypes already loaded in, so how that file
  795. is stored will not affect anything.
  796.  
  797. ------------------------------------------------------------------------------
  798.  
  799. >
  800. >ERROR <type> <...>
  801. >This command is used to indicate that a real error has occured.  The
  802. >remainder of the line is some free form text describing that error.
  803. >What the client does with that message is up to it.  This command is
  804. >only used to indicate actual program errors which point to
  805. >bugs/incompatibilities between it and the server such as malformed
  806. >packets and the like.  Player errors (like trying to take something
  807. >which isn't there) are handled by normal TEXT messages.
  808.  
  809. Provision is in place for smart error messages so that the
  810. client can act appropriately.  For example, the following
  811. are supported:
  812.  
  813. ERROR NOSUCHFILE <name> <type>
  814.  
  815. Where name and type are the same as in the REQUEST command above.  In this
  816. way, the client will know that the file is not available, and thus be able
  817. to do something more intelligent.  This should not happen - the client
  818. should not be requesting a file unless he knows he server has it
  819. (server uses a face or archetype name or something similar.)
  820.  
  821. ERROR FILENOTAVAIL <name> <type>
  822.  
  823. This is similar to NOSUCHFILE above, but in this case, the file exists,
  824. but for whatever reason, can not be sent/accessed.
  825.  
  826. ERROR BADFORMAT <text>
  827.  
  828. The data command was not properly formatted.  This could be caused
  829. by several things - a string is not properly quoted, or an improper
  830. number of arguments was given for any command (ie, REQUEST missing
  831. name/type argument)
  832.  
  833. ERROR <text>
  834.  
  835. This is just a text based error message, that are not in any specific
  836. category.
  837.  
  838. ------------------------------------------------------------------------------
  839. >
  840. >QUERY <flags> <...>
  841. >Ask the user a question with the text <...>.  Some clients may want to
  842. >pop up a requestor for this.  Others may not.  The answer is taken from 
  843. >the next REPLY packet sent by the client.  
  844. >
  845.  
  846. (REPLY is detailed in the C->S command section)
  847.  
  848.  QUERY and REPLY are really specialty commands.  While in the future
  849. they can perhaps be extended so that when an NPC speaks, it is a known
  850. question, right now, this can not happen.
  851.  
  852.  Where QUERY and REPLY are used is for rolling up characters.  For
  853. swapping stats, or just confirming if that is what you want to select,
  854. this is really the only way to do it.  Using SAY commands would be a
  855. real hack, and as it is, the server will know that it should do
  856. a QUERY for rolling characters.
  857.  
  858. <flags> is the type of QUERY.  Values:
  859. #define CS_QUERY_YESNO  0x1     /* Yes/no question */
  860. #define CS_QUERY_SINGLECHAR 0x2 /* Single character response expected */
  861. #define CS_QUERY_HIDEINPUT 0x4  /* Hide input being entered */
  862.  
  863. Note that these flags can be OR'd together (ie, 0x5 would mean that
  864. it is a yes/no question, but the input should be hidden)
  865.  
  866. Note - the client can pretty much ignore all of these flags, they are
  867. just here so that the client can do more intelligent things.
  868.  
  869. ------------------------------------------------------------------------------
  870.  
  871. S->C: KNOWN_SPELLS {<name>}
  872.  
  873. This is sent to inform the client of all the spells the character knows.
  874. This allows the client to verify if certain cast commands are
  875. legal.  This is really a convenience command, but in all cases, some
  876. verification would be required.  IF the player where in the middle of
  877. combat and tried to cast a spell, only to find out his keybinding was
  878. mistyped, he would be very upset.  Client can verify that keybindings
  879. are correct.
  880.  
  881.  Subsequent KNOWN_SPELLS after the first one denote new spells
  882. that have been learned.  Since there is no way to loose a spell
  883. from memory, there is no need to reset the spells.
  884.  
  885.  Client is free to ignore this data.  When the spell is cast, the
  886. server will verify it is correct.
  887.  
  888.  Sending along spellpoint cost should be done, but this information
  889. does vary (if SPELLPOINT_LEVEL_DEPEND is set, for example, then each
  890. time the player gains a level, spellpoint costs change.  Likewise,
  891. items that attune or repel spells will change this, and these could
  892. get applied quite often)
  893.  
  894.  
  895. ------------------------------------------------------------------------------
  896.  
  897. RANGE <range> <tag>
  898.  
  899. Tells the client that the object with <tag> is now range attack
  900. type <range>.  This is necessary because the client will not otherwise
  901. know if a weapon causes a range attack or not.  A <tag> of 0 would
  902. mean that that range type no longer has a range attack.
  903.  
  904. <range> values:  1=bow, 3=wand, 4=rod, 5=scroll,
  905.     6=horn, 7=steal (skill).
  906.  
  907. 2 is not used - this is range_magic, which the client will handle on
  908. its own.  Note that these values are teh same as the rangetype
  909. enumeration.  As that grows, sowill these.
  910.  
  911. ==============================================================================
  912. VALID COMMANDS FROM THE CLIENT TO THE SERVER
  913. ============================================
  914.  
  915. >LOGIN
  916.  This is detailed in the login section
  917.  
  918.  
  919. ------------------------------------------------------------------------------
  920.  
  921. >REQUEST
  922. >TRANSMIT
  923. >ERROR
  924. >These three commands are valid in this direction as well with the same
  925. >syntax and semantics.
  926.  
  927.  IT is unclear what the client would ever transmit, just as it is unclear
  928. what the server would ever request.  Thus, the client can ignore REQUESTS
  929. and not have TRANSMIT implemented.
  930.  
  931.  
  932. What ERROR messages the client sends is unknown.  In general, the
  933. server should know what it is talking about, and thus the client should
  934. never need to generate errors.  And because of this, the server can not
  935. really do much with the ERROR messages, except put them in a log file.
  936.  
  937. ------------------------------------------------------------------------------
  938. MOVE <tag> <number_of> <from_x> <from_y> <to_x> <to_y>
  939.  
  940. Where from_[xy] is where the object is, and to_[xy] is where the object
  941. is going.  This makes things easier for both the client and server to
  942. find the object to be moved.  All of these values have the same
  943. meaning as in the ITEM command (for containers)
  944.  
  945. <number_of> is the number of objects to be moved - this allows a player to
  946. drop 15 of 225 arrows.
  947.  
  948.  Note that this is a request to the client.  The server will send back
  949. ITEM/MOVE commands if the action is possible.
  950.  
  951.  This is the command that is used to move the player.  A walk would
  952. just have the to_x and to_y with a difference of 1 from the from_x and
  953. from_y values.
  954.  
  955.  To run, these values should have very large offsets (ie, if
  956. player is at 10,10 and wants to run east, client should send
  957. a MOVE <tag> <0> 50 10
  958.  
  959.  This would keep the player moving to the right until he reaches
  960. space 50 (which may never happen - a wall might be in the way.)  To
  961. abort the run, a new MOVE command would be sent, with new values.
  962.  
  963.  The client may vary well have some default run distance it uses when
  964. the player runs.  Client could keep track of the destination it
  965. sent, and when the player gets there, send another MOVE command with
  966. a new destination.
  967.  
  968. Note:  It was once suggested that firing objects would be handled
  969. in this command.  FIRE is now its own command.  You fire stuff in
  970. a a direction, and not at a coordinate.
  971.  
  972. ---------------------------------------------------------------------------
  973. APPLY <tag> <x> <y>
  974.  
  975. The player tries to apply the item with tag <number>, which is located
  976. at <x> <y>.
  977.  
  978. ---------------------------------------------------------------------------
  979.  
  980. FIRE <flags> <tag>
  981.  
  982. FIRE fires and object/spell.
  983.  
  984. <flags> contain direction (and possibly no direction, meaning the player
  985. cast the spell on himself).  It may be extended in the future to include
  986. additional information (if throw is added, then setting flag to something
  987. would indicate that the item was thrown, and not fired.)
  988.  
  989. <tag> is the item tag to be fired.  <tag> will be a string to
  990. represent spell casting
  991.  
  992.  All spell casting is handled through this command.  Invoking and
  993. casting a spell are one in the same as far as this command is
  994. concerned.  IT is up to the client to handle these different (in
  995. general, an invoked spell will be sent immediately, where casting a spell
  996. just changes the range attack type.)
  997.  
  998. ---------------------------------------------------------------------------
  999.  
  1000.  
  1001. SAY <flags> <text>
  1002. The player says whatever the free-form text which follows on the line
  1003. is.  Other players would see this by means of some TEXT message.
  1004.  
  1005. <flags> determines how this should be handled.  Values of flag should be
  1006. as:
  1007.  
  1008. 0x1    Text is a normal say command.
  1009. 0x2    Text is actually shouted.
  1010. 0x4    Text is a party say command (maybe shouldn't exist?  At least not
  1011.     realisticly)
  1012.  
  1013. ------------------------------------------------------------------------------
  1014.  
  1015. REPLY <text>
  1016.  
  1017. The response to the most recent QUERY command.
  1018. Actually, the server is not likely to send another QUERY command until
  1019. the last one is answered.
  1020.  
  1021. ------------------------------------------------------------------------------
  1022.  
  1023. EXAMINE <tag> <locx> <locy>
  1024.  
  1025. Examines object with <tag>, at <locx> <locy>.  If tag is 0, then this is the
  1026. same thing as looking at a square.
  1027.  
  1028.  All information is sent back as TEXT messages.  How the client
  1029. deals with them is up to it (ie, it may try and parse them and then
  1030. do certain actions based upon the information received.)
  1031.  
  1032. ------------------------------------------------------------------------------
  1033.  
  1034. COMMAND (command)
  1035.  
  1036. This is a simple extension.  Various servers may
  1037. add commands that do not warrant extending the protocol.  Right
  1038. now, there are many commands that really do not need individual
  1039. protocl requests (who, help, etc).  An option in the client can
  1040. exist to pass the command directly to the server.  If the
  1041. server does not understand the command, it can send the error
  1042. back as TEXT message.
  1043.  
  1044. Only optional commands should use the COMMAND name.  A required command
  1045. should be part of the protocol.  Examples of commands that might be
  1046. sent are things like who, maps, malloc, etc.  There are a lot of
  1047. misc. commands which just sent back text and take no arguments.
  1048.  
  1049. ------------------------------------------------------------------------------
  1050.  
  1051. C->S: SET <var> <value>
  1052.  
  1053.  This sets a <var> to <value> on the server.  Depending on display or
  1054. bandwidth, different information may not be required.  This sets some
  1055. of these options:
  1056.  
  1057. Variables:
  1058.  
  1059. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
  1060.   STACKING (depth)
  1061.   This is how many images the client plans to display per space.  If
  1062.   using fonts or bitmaps, then any value beyond 1 does not have any meaning
  1063.   (the client probably will not be able to display them.)
  1064.  
  1065.   For pixmaps, this can have meaning up to a reasonably high number.
  1066.  
  1067.   The server should handle a STACKING 1 request - this
  1068.   is to reduce bandwidth on clients that can not display things with
  1069.   a higher stack.
  1070.  
  1071.   How exactly the server handles other stacking requests is up to it.  However,
  1072.   it should never send more objects per square than the STACKING request
  1073.   request level.
  1074.  
  1075.   Things become a little more difficult with the DOUBLE_FLOOR patch
  1076.   (which would show two floors.)  As such, the following should 
  1077.   be the standard for different stacking levels:
  1078.  
  1079.   Level    What is shown
  1080.   1    just the top most object
  1081.   2    top object + bottom floor.
  1082.   3    top object + both floors.
  1083.   4+    level-2 top objects, and all floors.
  1084.  
  1085.   This makes the STACKING systematic.  Level 2 stacking probably won't
  1086.   be used much.  With this system, the client knows at most how many
  1087.   objects it will get sent - this is quite useful, because anything more
  1088.   than a couple items in 1 square become indistinguishable.
  1089.  
  1090.   This can be changed during game play - however, how the server handles
  1091.   this may vary - the server may end up resending the entire map when
  1092.   the stacking changes.
  1093.  
  1094. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
  1095.   SOUND <0|1>
  1096.  
  1097.   Whether PLAY commands should be sent from the server.  If the value is
  1098.   0, then client does not want PLAY commands.  If 1, then play commands
  1099.   should be sent.
  1100.  
  1101. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
  1102.   LOOK_DEPTH <val>
  1103.  
  1104.   This determines how many objects should be sent for the square the player
  1105.   is standing on.  <val> has the same meaning as STACKING above, but should
  1106.   almost always be higher.
  1107.  
  1108.   Low values might be desired while in combat, so that if you run over a large
  1109.   pile of stuff, you don't get a large delay as 30 items are sent.
  1110.  
  1111. ------------------------------------------------------------------------------
  1112. Various thoughts are welcome.  I am really worried about finding a good
  1113. way to implement the MAP and ITEM commands in an efficient manner.
  1114.  
  1115. Mark Wedel
  1116. master@rahul.net
  1117.  
  1118.